package com.doctcloud.common.elasticsearch.model;

import java.util.Collections;
import java.util.List;

/**
 * Elasticsearch 分页结果模型
 * 补充页码、每页条数、总页数，支持参数校验，兼容前端分页组件
 */

public class EsPageResult<T> {
    /**
     * 当前页码（默认1，避免前端无参时显示异常）
     */
    private int page = 1;

    /**
     * 每页条数（默认10，避免条数为0或负数导致无数据）
     */
    private int size = 10;

    /**
     * 总记录数（从ES响应中提取，默认0）
     */
    private long total = 0;

    /**
     * 总页数（自动计算，避免前端重复计算）
     */
    private long totalPages;

    public EsPageResult(int page, int size, long total, long totalPages, List<T> records) {
        this.page = page;
        this.size = size;
        this.total = total;
        this.totalPages = totalPages;
        this.records = records;
    }

    public EsPageResult() {
    }

    /**
     * 当前页数据列表（默认空列表，避免返回null导致NPE）
     */
    private List<T> records = Collections.emptyList();

    /**
     * 计算总页数（setTotal后自动触发，无需手动调用）
     * 公式：总页数 = 总记录数 % 每页条数 == 0 ? 总记录数/每页条数 : 总记录数/每页条数 + 1
     */
    public void setTotal(long total) {
        this.total = Math.max(total, 0); // 确保总记录数非负
        calculateTotalPages();
    }

    /**
     * 设置当前页码（自动校验，避免页码为0或负数）
     */
    public void setPage(int page) {
        this.page = Math.max(page, 1); // 页码最小为1
    }

    /**
     * 设置每页条数（自动校验，避免条数为0或负数）
     */
    public void setSize(int size) {
        this.size = Math.max(size, 1); // 条数最小为1
        calculateTotalPages(); // 条数变化时重新计算总页数
    }

    public int getPage() {
        return page;
    }

    public int getSize() {
        return size;
    }

    public long getTotal() {
        return total;
    }

    public long getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(long totalPages) {
        this.totalPages = totalPages;
    }

    public List<T> getRecords() {
        return records;
    }

    /**
     * 设置数据列表（避免传入null，统一返回空列表）
     */
    public void setRecords(List<T> records) {
        this.records = records == null ? Collections.emptyList() : records;
    }

    /**
     * 私有方法：计算总页数
     */
    private void calculateTotalPages() {
        if (this.size == 0) {
            this.totalPages = 0;
            return;
        }
        this.totalPages = this.total % this.size == 0
                ? this.total / this.size
                : this.total / this.size + 1;
    }
}